{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Build a DNN using the Keras Functional API\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "## Learning objectives\n",
    "\n",
    "1. Review how to read in CSV file data using tf.data.\n",
    "2. Specify input, hidden, and output layers in the DNN architecture.\n",
    "3. Review and visualize the final DNN shape.\n",
    "4. Train the model locally and visualize the loss curves.\n",
    "5. Deploy and predict with the model using Cloud AI Platform. \n",
    "\n",
    "\n",
    "## Introduction\n",
    "\n",
    "In this notebook, we will build a Keras DNN to predict the fare amount for NYC taxi cab rides.\n",
    "\n",
    "Each learning objective will correspond to a __#TODO__ in the [student lab notebook](../labs/neural_network.ipynb) -- try to complete that notebook first before reviewing this solution notebook. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "!sudo chown -R jupyter:jupyter /home/jupyter/training-data-analyst"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "!sudo apt-get install graphviz -y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "TensorFlow version:  2.6.2\n"
     ]
    }
   ],
   "source": [
    "# You can use any Python source file as a module by executing an import statement in some other Python source file\n",
    "# The import statement combines two operations; it searches for the named module, then it binds the\n",
    "# results of that search to a name in the local scope.\n",
    "import os, json, math\n",
    "# Import data processing libraries like Numpy and TensorFlow\n",
    "import numpy as np\n",
    "import tensorflow as tf\n",
    "# Python shutil module enables us to operate with file objects easily and without diving into file objects a lot.\n",
    "import shutil\n",
    "# Show the currently installed version of TensorFlow\n",
    "print(\"TensorFlow version: \",tf.version.VERSION)\n",
    "\n",
    "os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3' # SET TF ERROR LOG VERBOSITY"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Locating the CSV files\n",
    "\n",
    "We will start with the CSV files that we wrote out in the other notebook. Just so you don't have to run the notebook, we saved a copy in ../data/toy_data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-rw-r--r-- 1 jupyter jupyter 1111933 Dec 27 13:19 ../data/toy_data/taxi-traffic-test_toy.csv\n",
      "-rw-r--r-- 1 jupyter jupyter 4772181 Dec 27 13:19 ../data/toy_data/taxi-traffic-train_toy.csv\n",
      "-rw-r--r-- 1 jupyter jupyter 1038564 Dec 27 13:19 ../data/toy_data/taxi-traffic-valid_toy.csv\n"
     ]
    }
   ],
   "source": [
    "# `ls` is a Linux shell command that lists directory contents\n",
    "# `l` flag list all the files with permissions and details\n",
    "!ls -l ../data/toy_data/*.csv"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Lab Task 1: Use tf.data to read the CSV files\n",
    "\n",
    "\n",
    "First let's define our columns of data, which column we're predicting for, and the default values."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Define columns of data\n",
    "CSV_COLUMNS  = ['fare_amount',  'pickup_datetime',\n",
    "                'pickup_longitude', 'pickup_latitude', \n",
    "                'dropoff_longitude', 'dropoff_latitude', \n",
    "                'passenger_count', 'key']\n",
    "LABEL_COLUMN = 'fare_amount'\n",
    "DEFAULTS     = [[0.0],['na'],[0.0],[0.0],[0.0],[0.0],[0.0],['na']]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Next, let's define our features we want to use and our label(s) and then load in the dataset for training."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Define features you want to use\n",
    "def features_and_labels(row_data):\n",
    "    for unwanted_col in ['pickup_datetime', 'key']:\n",
    "        row_data.pop(unwanted_col)\n",
    "    label = row_data.pop(LABEL_COLUMN)\n",
    "    return row_data, label  # features, label\n",
    "\n",
    "# load the training data\n",
    "def load_dataset(pattern, batch_size=1, mode=tf.estimator.ModeKeys.EVAL):\n",
    "  dataset = (tf.data.experimental.make_csv_dataset(pattern, batch_size, CSV_COLUMNS, DEFAULTS)\n",
    "             .map(features_and_labels) # features, label\n",
    "             )\n",
    "  if mode == tf.estimator.ModeKeys.TRAIN:\n",
    "        dataset = dataset.shuffle(1000).repeat()\n",
    "  dataset = dataset.prefetch(1) # take advantage of multi-threading; 1=AUTOTUNE\n",
    "  return dataset"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Lab Task 2: Build a DNN with Keras\n",
    "\n",
    "Now let's build the Deep Neural Network (DNN) model in Keras and specify the input and hidden layers. We will print out the DNN architecture and then visualize it later on."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
     {
      "name": "stdout",
      "output_type": "stream",
      "text": [
       "Here is our DNN architecture so far:\n",
       "\n",
       "Model: \"model\"\n",
       "__________________________________________________________________________________________________\n",
       "Layer (type)                    Output Shape         Param #     Connected to                     \n",
       "==================================================================================================\n",
       "dropoff_latitude (InputLayer)   [(None,)]            0                                            \n",
       "__________________________________________________________________________________________________\n",
       "dropoff_longitude (InputLayer)  [(None,)]            0                                            \n",
       "__________________________________________________________________________________________________\n",
       "passenger_count (InputLayer)    [(None,)]            0                                            \n",
       "__________________________________________________________________________________________________\n",
       "pickup_latitude (InputLayer)    [(None,)]            0                                            \n",
       "__________________________________________________________________________________________________\n",
       "pickup_longitude (InputLayer)   [(None,)]            0                                            \n",
       "__________________________________________________________________________________________________\n",
       "dense_features (DenseFeatures)  (None, 5)            0           dropoff_latitude[0][0]           \n",
       "                                                                 dropoff_longitude[0][0]          \n",
       "                                                                 passenger_count[0][0]            \n",
       "                                                                 pickup_latitude[0][0]            \n",
       "                                                                 pickup_longitude[0][0]           \n",
       "__________________________________________________________________________________________________\n",
       "h1 (Dense)                      (None, 32)           192         dense_features[0][0]             \n",
       "__________________________________________________________________________________________________\n",
       "h2 (Dense)                      (None, 8)            264         h1[0][0]                         \n",
       "__________________________________________________________________________________________________\n",
       "fare (Dense)                    (None, 1)            9           h2[0][0]                         \n",
       "==================================================================================================\n",
       "Total params: 465\n",
       "Trainable params: 465\n",
       "Non-trainable params: 0\n",
       "__________________________________________________________________________________________________\n",
       "None\n"
      ]
     }
   ],
   "source": [
    "# Build a simple Keras DNN using its Functional API\n",
    "def rmse(y_true, y_pred):\n",
    "    return tf.sqrt(tf.reduce_mean(tf.square(y_pred - y_true))) \n",
    "\n",
    "def build_dnn_model():\n",
    "    INPUT_COLS = ['pickup_longitude', 'pickup_latitude', \n",
    "                  'dropoff_longitude', 'dropoff_latitude', \n",
    "                  'passenger_count']\n",
    "\n",
    "    # TODO 2\n",
    "    # input layer\n",
    "    inputs = {\n",
    "        colname : tf.keras.layers.Input(name=colname, shape=(), dtype='float32')\n",
    "           for colname in INPUT_COLS\n",
    "    }\n",
    "    # tf.feature_column.numeric_column() represents real valued or numerical features.\n",
    "    feature_columns = {\n",
    "        colname : tf.feature_column.numeric_column(colname)\n",
    "           for colname in INPUT_COLS\n",
    "    }\n",
    "    \n",
    "    # the constructor for DenseFeatures takes a list of numeric columns\n",
    "    # The Functional API in Keras requires that you specify: LayerConstructor()(inputs)\n",
    "    dnn_inputs = tf.keras.layers.DenseFeatures(feature_columns.values())(inputs)\n",
    "\n",
    "    # two hidden layers of [32, 8] just in like the BQML DNN\n",
    "    h1 = tf.keras.layers.Dense(32, activation='relu', name='h1')(dnn_inputs)\n",
    "    h2 = tf.keras.layers.Dense(8, activation='relu', name='h2')(h1)\n",
    "\n",
    "    # final output is a linear activation because this is regression\n",
    "    output = tf.keras.layers.Dense(1, activation='linear', name='fare')(h2)\n",
    "    model = tf.keras.models.Model(inputs, output)\n",
    "    model.compile(optimizer='adam', loss='mse', metrics=[rmse, 'mse'])\n",
    "    return model\n",
    "\n",
    "print(\"Here is our DNN architecture so far:\\n\")\n",
    "model = build_dnn_model()\n",
    "print(model.summary())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Lab Task 3: Visualize the DNN\n",
    "\n",
    "We can visualize the DNN using the Keras [plot_model](https://www.tensorflow.org/versions/r2.0/api_docs/python/tf/keras/utils/plot_model) utility."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
     {
      "data": {
       "image/png": "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\n",
       "text/plain": [
        "<IPython.core.display.Image object>"
       ]
      },
      "execution_count": 9,
      "metadata": {},
      "output_type": "execute_result"
     }
   ],
   "source": [
    "# tf.keras.utils.plot_model() Converts a Keras model to dot format and save to a file.\n",
    "tf.keras.utils.plot_model(model, 'dnn_model.png', show_shapes=False, rankdir='LR')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Lab Task 4: Train the model\n",
    "\n",
    "To train the model, simply call [model.fit()](https://keras.io/models/model/#fit).\n",
    "\n",
    "Note that we should really use many more NUM_TRAIN_EXAMPLES (i.e. a larger dataset). We shouldn't make assumptions about the quality of the model based on training/evaluating it on a small sample of the full data."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
     {
      "name": "stdout",
      "output_type": "stream",
      "text": [
       "Epoch 1/32\n",
       "48/48 [==============================] - 3s 27ms/step - loss: 235.7720 - rmse: 13.7553 - mse: 235.7720 - val_loss: 110.4047 - val_rmse: 10.4883 - val_mse: 110.4047\n",
       "Epoch 2/32\n",
       "48/48 [==============================] - 1s 19ms/step - loss: 98.6303 - rmse: 9.4142 - mse: 98.6303 - val_loss: 98.4514 - val_rmse: 9.9093 - val_mse: 98.4514\n",
       "Epoch 3/32\n",
       "48/48 [==============================] - 1s 17ms/step - loss: 107.8138 - rmse: 9.7092 - mse: 107.8138 - val_loss: 102.7607 - val_rmse: 10.1268 - val_mse: 102.7607\n",
       "Epoch 4/32\n",
       "48/48 [==============================] - 1s 19ms/step - loss: 82.5860 - rmse: 8.7516 - mse: 82.5860 - val_loss: 101.0118 - val_rmse: 10.0274 - val_mse: 101.0118\n",
       "Epoch 5/32\n",
       "48/48 [==============================] - 1s 21ms/step - loss: 105.2541 - rmse: 9.7572 - mse: 105.2541 - val_loss: 94.6448 - val_rmse: 9.7202 - val_mse: 94.6448\n",
       "Epoch 6/32\n",
       "48/48 [==============================] - 1s 19ms/step - loss: 87.0221 - rmse: 8.8074 - mse: 87.0221 - val_loss: 92.7677 - val_rmse: 9.6182 - val_mse: 92.7677\n",
       "Epoch 7/32\n",
       "48/48 [==============================] - 1s 15ms/step - loss: 84.5465 - rmse: 8.7047 - mse: 84.5465 - val_loss: 93.4660 - val_rmse: 9.6532 - val_mse: 93.4660\n",
       "Epoch 8/32\n",
       "48/48 [==============================] - 1s 18ms/step - loss: 81.7053 - rmse: 8.7184 - mse: 81.7053 - val_loss: 90.3732 - val_rmse: 9.4811 - val_mse: 90.3732\n",
       "Epoch 9/32\n",
       "48/48 [==============================] - 1s 22ms/step - loss: 98.6255 - rmse: 9.2856 - mse: 98.6255 - val_loss: 93.1866 - val_rmse: 9.6270 - val_mse: 93.1866\n",
       "Epoch 10/32\n",
       "48/48 [==============================] - 1s 22ms/step - loss: 76.0910 - rmse: 8.3905 - mse: 76.0910 - val_loss: 88.7710 - val_rmse: 9.4147 - val_mse: 88.7710\n",
       "Epoch 11/32\n",
       "48/48 [==============================] - 1s 19ms/step - loss: 106.0239 - rmse: 9.4099 - mse: 106.0239 - val_loss: 90.6839 - val_rmse: 9.5086 - val_mse: 90.6839\n",
       "Epoch 12/32\n",
       "48/48 [==============================] - 1s 17ms/step - loss: 87.8803 - rmse: 9.0418 - mse: 87.8803 - val_loss: 86.1875 - val_rmse: 9.2676 - val_mse: 86.1875\n",
       "Epoch 13/32\n",
       "48/48 [==============================] - 1s 19ms/step - loss: 94.2254 - rmse: 9.2148 - mse: 94.2254 - val_loss: 90.8162 - val_rmse: 9.5033 - val_mse: 90.8162\n",
       "Epoch 14/32\n",
       "48/48 [==============================] - 1s 21ms/step - loss: 79.3273 - rmse: 8.5551 - mse: 79.3273 - val_loss: 88.0802 - val_rmse: 9.3689 - val_mse: 88.0802\n",
       "Epoch 15/32\n",
       "48/48 [==============================] - 1s 20ms/step - loss: 83.2815 - rmse: 8.5821 - mse: 83.2815 - val_loss: 89.9542 - val_rmse: 9.4520 - val_mse: 89.9542\n",
       "Epoch 16/32\n",
       "48/48 [==============================] - 1s 20ms/step - loss: 108.9430 - rmse: 9.9638 - mse: 108.9430 - val_loss: 88.2822 - val_rmse: 9.3800 - val_mse: 88.2822\n",
       "Epoch 17/32\n",
       "48/48 [==============================] - 1s 20ms/step - loss: 99.4533 - rmse: 9.4541 - mse: 99.4533 - val_loss: 84.7399 - val_rmse: 9.2011 - val_mse: 84.7399\n",
       "Epoch 18/32\n",
       "48/48 [==============================] - 1s 21ms/step - loss: 92.2669 - rmse: 9.2730 - mse: 92.2669 - val_loss: 86.2728 - val_rmse: 9.2836 - val_mse: 86.2728\n",
       "Epoch 19/32\n",
       "48/48 [==============================] - 1s 17ms/step - loss: 69.4746 - rmse: 7.9253 - mse: 69.4746 - val_loss: 85.0289 - val_rmse: 9.2164 - val_mse: 85.0289\n",
       "Epoch 20/32\n",
       "48/48 [==============================] - 1s 19ms/step - loss: 87.9585 - rmse: 8.9190 - mse: 87.9585 - val_loss: 90.3942 - val_rmse: 9.4920 - val_mse: 90.3942\n",
       "Epoch 21/32\n",
       "48/48 [==============================] - 1s 21ms/step - loss: 83.6129 - rmse: 8.7324 - mse: 83.6129 - val_loss: 87.2180 - val_rmse: 9.3230 - val_mse: 87.2180\n",
       "Epoch 22/32\n",
       "48/48 [==============================] - 1s 25ms/step - loss: 93.5777 - rmse: 9.1330 - mse: 93.5777 - val_loss: 85.1410 - val_rmse: 9.2141 - val_mse: 85.1410\n",
       "Epoch 23/32\n",
       "48/48 [==============================] - 1s 23ms/step - loss: 94.6771 - rmse: 9.1680 - mse: 94.6771 - val_loss: 92.8359 - val_rmse: 9.6173 - val_mse: 92.8359\n",
       "Epoch 24/32\n",
       "48/48 [==============================] - 1s 28ms/step - loss: 106.3276 - rmse: 9.6866 - mse: 106.3276 - val_loss: 82.4740 - val_rmse: 9.0562 - val_mse: 82.4740\n",
       "Epoch 25/32\n",
       "48/48 [==============================] - 1s 24ms/step - loss: 98.7554 - rmse: 9.4935 - mse: 98.7554 - val_loss: 91.2657 - val_rmse: 9.5318 - val_mse: 91.2657\n",
       "Epoch 26/32\n",
       "48/48 [==============================] - 1s 18ms/step - loss: 87.7539 - rmse: 8.9782 - mse: 87.7539 - val_loss: 87.4514 - val_rmse: 9.3295 - val_mse: 87.4514\n",
       "Epoch 27/32\n",
       "48/48 [==============================] - 1s 20ms/step - loss: 91.1415 - rmse: 9.0906 - mse: 91.1415 - val_loss: 87.7224 - val_rmse: 9.3360 - val_mse: 87.7224\n",
       "Epoch 28/32\n",
       "48/48 [==============================] - 1s 20ms/step - loss: 92.3360 - rmse: 9.0298 - mse: 92.3360 - val_loss: 80.1138 - val_rmse: 8.9436 - val_mse: 80.1138\n",
       "Epoch 29/32\n",
       "48/48 [==============================] - 1s 20ms/step - loss: 94.5420 - rmse: 9.2082 - mse: 94.5420 - val_loss: 87.8058 - val_rmse: 9.3616 - val_mse: 87.8058\n",
       "Epoch 30/32\n",
       "48/48 [==============================] - 1s 21ms/step - loss: 96.6392 - rmse: 9.2406 - mse: 96.6392 - val_loss: 87.0802 - val_rmse: 9.3158 - val_mse: 87.0802\n",
       "Epoch 31/32\n",
       "48/48 [==============================] - 1s 19ms/step - loss: 81.5718 - rmse: 8.5776 - mse: 81.5718 - val_loss: 88.9023 - val_rmse: 9.4058 - val_mse: 88.9023\n",
       "Epoch 32/32\n",
       "48/48 [==============================] - 1s 20ms/step - loss: 87.5617 - rmse: 8.8720 - mse: 87.5617 - val_loss: 84.3392 - val_rmse: 9.1772 - val_mse: 84.3392\n"
      ]
     }
   ],
   "source": [
    "TRAIN_BATCH_SIZE = 32\n",
    "NUM_TRAIN_EXAMPLES = 10000 * 5 # training dataset repeats, so it will wrap around\n",
    "NUM_EVALS = 32  # how many times to evaluate\n",
    "NUM_EVAL_EXAMPLES = 10000 # enough to get a reasonable sample, but not so much that it slows down\n",
    "\n",
    "trainds = load_dataset('../data/toy_data/taxi-traffic-train*', TRAIN_BATCH_SIZE, tf.estimator.ModeKeys.TRAIN)\n",
    "evalds = load_dataset('../data/toy_data/taxi-traffic-valid*', 1000, tf.estimator.ModeKeys.EVAL).take(NUM_EVAL_EXAMPLES//1000)\n",
    "\n",
    "steps_per_epoch = NUM_TRAIN_EXAMPLES // (TRAIN_BATCH_SIZE * NUM_EVALS)\n",
    "\n",
    "# Model Fit\n",
    "history = model.fit(trainds, \n",
    "                    validation_data=evalds,\n",
    "                    epochs=NUM_EVALS, \n",
    "                    steps_per_epoch=steps_per_epoch)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Visualize the model loss curve\n",
    "\n",
    "Next, we will use matplotlib to draw the model's loss curves for training and validation."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x360 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# plot\n",
    "# Use matplotlib for visualizing the model\n",
    "import matplotlib.pyplot as plt\n",
    "nrows = 1\n",
    "ncols = 2\n",
    "# The .figure() method will create a new figure, or activate an existing figure.\n",
    "fig = plt.figure(figsize=(10, 5))\n",
    "\n",
    "for idx, key in enumerate(['loss', 'rmse']):\n",
    "    ax = fig.add_subplot(nrows, ncols, idx+1)\n",
    "# The .plot() is a versatile function, and will take an arbitrary number of arguments. For example, to plot x versus y.\n",
    "    plt.plot(history.history[key])\n",
    "    plt.plot(history.history['val_{}'.format(key)])\n",
    "# The .title() method sets a title for the axes.\n",
    "    plt.title('model {}'.format(key))\n",
    "    plt.ylabel(key)\n",
    "    plt.xlabel('epoch')\n",
    "# The .legend() method will place a legend on the axes.\n",
    "    plt.legend(['train', 'validation'], loc='upper left');"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Lab Task 5: Predict with the model locally\n",
    "\n",
    "To predict with Keras, you simply call [model.predict()](https://keras.io/models/model/#predict) and pass in the cab ride you want to predict the fare amount for."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[16.609783]], dtype=float32)"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# TODO 5\n",
    "# Use the model to do prediction with `model.predict()`\n",
    "model.predict({\n",
    "    'pickup_longitude': tf.convert_to_tensor([-73.982683]),\n",
    "    'pickup_latitude': tf.convert_to_tensor([40.742104]),\n",
    "    'dropoff_longitude': tf.convert_to_tensor([-73.983766]),\n",
    "    'dropoff_latitude': tf.convert_to_tensor([40.755174]),\n",
    "    'passenger_count': tf.convert_to_tensor([3.0]),    \n",
    "}, steps=1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Of course, this is not realistic, because we can't expect client code to have a model object in memory. We'll have to export our model to a file, and expect client code to instantiate the model from that exported file."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Copyright 2021 Google Inc.\n",
    "Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this file except in compliance with the License. You may obtain a copy of the License at\n",
    "http://www.apache.org/licenses/LICENSE-2.0\n",
    "Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License."
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
